@livius As previous I intend SiPy-1.6.7.b1.tar I can post you the entire code, but this could be used only with our device connected to the UART serial port. Anyway, I post you the code used to handle sockets, because I suspect that the issue could be related to this task: import _thread import tracingfunction import time import socket import pycom # Global array for rx data from serial port SerialRxPacketsLock = _thread.allocate_lock() # this value define the max number of parallel socket! # Don't configure a value grather than the maximum allowable connections # on uart device!! (see the define MAX_SOCK_NUM in the uart device project) MaxNumActiveSockets = 6 # this arry is used by the task serialport to request a close on the relative socket KillRequestSocketList = bytearray(MaxNumActiveSockets) # this mutex is used to avoid thread conflicts in th access of the list of packets and socket SocketListLock = _thread.allocate_lock() # list of packets that must be sent on a particular socket rxPacketsFromSerialPortList = [] # list of enabled sockets socketList = [] # list of id related to the socket! socketUniqueIdList = bytearray(MaxNumActiveSockets) pycom.heartbeat(False) currentRGBLed = 0x007f00 # this function return the number of current active sockets def GetNumOfActiveSocketList(): global SocketListLock global socketList global MaxNumActiveSockets idx=0 totalActiveSocket=0 SocketListLock.acquire() while(idx<MaxNumActiveSockets): if(socketList[idx]!=None): totalActiveSocket=totalActiveSocket + 1 idx = idx + 1 SocketListLock.release() return totalActiveSocket # this function return the position of the first free socket slot def ObtainSocketListPosition(): global SocketListLock global MaxNumActiveSockets idx=0 SocketListLock.acquire() while(idx<MaxNumActiveSockets): if(socketList[idx]==None): break idx = idx + 1 if(idx==MaxNumActiveSockets): idx=-1 SocketListLock.release() return idx def toggleRGBLed(): global currentRGBLed if(currentRGBLed==0x007f00): currentRGBLed=0 else: currentRGBLed=0x007f00 pycom.rgbled(currentRGBLed) # socketThread # This task is responsible to handle data from/to the socket # ------------------------------------------------------------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------------------------------------------------------------ # ------------------------------------------------------------------------------------------------------------------------------------------------------------------ def socketThread(voidPar): import stuffingfunctions global socketList global SerialRxPacketsLock global rxPacketsFromSerialPortList global KillRequestSocketList # we print on the terminal that the thread started print ("socketThread Started") # set counters and ids to zero idxSocketToCheck = 0 aliveCounter = 0 pycom.rgbled(0x00007f) # infinite loop! while True: # increase the alive counter aliveCounter = aliveCounter + 1 # if the alive counter reachs 15000, print on the # terminal that this thread is alive if(aliveCounter>15000): aliveCounter = 0 print("socketThread alive!!") # assign the thread socket position threadIdPos = idxSocketToCheck # if there is a kill request, the buffer is empty and the socket is valid, close the socket if(KillRequestSocketList[threadIdPos]==1) and (socketList[threadIdPos]!=None) and (rxPacketsFromSerialPortList[threadIdPos]==None): socketList[threadIdPos].close() socketList[threadIdPos]=None KillRequestSocketList[threadIdPos]=0 print("Socket " + str(threadIdPos) + " killed!") # acquire the mutex SerialRxPacketsLock.acquire() if (socketList[threadIdPos]!=None): # if the current socket is alive if(rxPacketsFromSerialPortList[threadIdPos]==None): # if there is no data to send, do nothing pass else: # if there is data to send, try to send it try: print("Writing data into socket " + str(threadIdPos)) socketList[threadIdPos].send(rxPacketsFromSerialPortList[threadIdPos]) print("Write data ok") rxPacketsFromSerialPortList[threadIdPos]=None toggleRGBLed() # pycom.rgbled(0x007f00) except: # in case of exception, trace on file and close the socket print("Exception sending data " + str(threadIdPos)) tracingfunction.TraceLine("Exception sending data to the socket!") socketList[threadIdPos].close() socketList[threadIdPos]=None stuffingfunctions.WriteStuffingSerialPort(None, 0,threadIdPos, 1, socketUniqueIdList[threadIdPos]) rxPacketsFromSerialPortList[threadIdPos]=None else: # if the current socket is not alive, drop the data... rxPacketsFromSerialPortList[threadIdPos]=None # release the mutex SerialRxPacketsLock.release() if (socketList[threadIdPos]!=None): # if the current socket is alive # set partialData to None partialData=None while True: try: data=None #Receiving from client data = socketList[threadIdPos].recv(1460) if not data: # if we have not received anitying if (partialData!=None): # in this case, if we have partial data != none, the data is only in the partialData array data=partialData print("Received data from socket " + str(threadIdPos) + " Len: " + str(len(data))) stuffingfunctions.WriteStuffingSerialPort(data, len(data),threadIdPos, 0 , socketUniqueIdList[threadIdPos]) toggleRGBLed() # pycom.rgbled(0x00007f) break else: if(len(data)>0): # if we have received something if(len(data)==1024): # in this case, there are probably many bytes to read (python slices packets greather than 1024 in multiple packets) # we save this data in the partialData and we issue a new read request... partialData=data time.sleep(0.002) continue else: if (partialData!=None): # in this case, if we have partial data != none, we compose the full packet partialData = partialData + data data = partialData else: # in this case, the data is only in the data array pass # we pass the packet to the serial port! print("Received data from socket " + str(threadIdPos) + " Len: " + str(len(data))) stuffingfunctions.WriteStuffingSerialPort(data, len(data),threadIdPos, 0 , socketUniqueIdList[threadIdPos]) toggleRGBLed() # pycom.rgbled(0x00007f) break break except socket.timeout: if data: if(len(data)>0): # added 30/03/2017 10.17 -----> if (partialData!=None): # in this case, if we have partial data != none, we compose the full packet partialData = partialData + data data = partialData else: # in this case, the data is only in the data array pass # added 30/03/2017 10.17 <----- print("Received data from socket " + str(threadIdPos)) stuffingfunctions.WriteStuffingSerialPort(data, len(data),threadIdPos, 0 , socketUniqueIdList[threadIdPos]) toggleRGBLed() break except socket.error: # in case of error exception, we close the socket print("Closing socket thread " + str(threadIdPos)) if(socketList[threadIdPos]!=None): socketList[threadIdPos].close() socketList[threadIdPos]=None stuffingfunctions.WriteStuffingSerialPort(None, 0,threadIdPos, 1 , socketUniqueIdList[threadIdPos]) break # we increase the socket idx idxSocketToCheck = idxSocketToCheck + 1 # eache time we parse all sockets, we do a pause of 2 ms if idxSocketToCheck==MaxNumActiveSockets: idxSocketToCheck = 0 time.sleep(0.002) # we should never reach this point print ("ThreadRx " + str(threadIdPos) + " terminated!")